package com.google.code.lf.gfm.ui.dialog;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
 * Classe regroupant des méthodes de gestion de {@link Dialog}.
 */
public class DialogHelper {

	/**
	 * Constructeur. Ne doit pas être appelé.
	 * @throws UnsupportedOperationException Toujours
	 */
	private DialogHelper() {
		throw new UnsupportedOperationException("Classe utilitaire");
	}

	/**
	 * Affiche une boite de dialogue indiquant une erreur critique.<br/>
	 * La boite de dialogue affiche un message d'erreur standardisé.
	 * @param status Le {@link IStatus} contenant l'erreur.
	 */
	public static void errorCriticDialog(final IStatus status) {
		ErrorDialog.openError(getShell(), "Erreur", "Une erreur s'est produite.", status);
	}

	/**
	 * Affiche une boite de dialogue d'erreur.
	 * @param msg Le message à afficher.
	 * @param title Le titre de la boîte de dialogue.
	 */
	public static void errorDialog(final String msg, final String title) {
		MessageDialog.openError(getActiveShell(), title, msg);
	}

	/**
	 * Affiche une boite de dialogue d'information.
	 * @param msg Le message à afficher.
	 * @param title Le titre de la boîte de dialogue.
	 */
	public static void infoDialog(final String msg, final String title) {
		MessageDialog.openInformation(getActiveShell(), title, msg);
	}

	/**
	 * Affiche une boite de dialogue d'avertissement.
	 * @param msg Le message à afficher.
	 * @param title Le titre de la boîte de dialogue.
	 */
	public static void warnDialog(final String msg, final String title) {
		MessageDialog.openWarning(getActiveShell(), title, msg);
	}

	/**
	 * Affiche une boite de dialogue pour une confirmation à l'utilisateur.
	 * @param msg Le message à afficher.
	 * @param title Le titre de la boîte de dialogue.
	 * @return <code>true</code> si l'utilisateur clique sur "OK", <code>false</code> sinon.
	 */
	public static boolean confirmationDialog(final String msg, final String title) {
		return MessageDialog.openConfirm(getActiveShell(), title, msg);
	}

	/**
	 * Affiche une boite de dialogue pour une question à l'utilisateur.
	 * @param msg Le message à afficher.
	 * @param title Le titre de la boîte de dialogue.
	 * @return <code>true</code> si l'utilisateur clique sur "OK", <code>false</code> sinon.
	 */
	public static boolean questionDialog(final String msg, final String title) {
		return MessageDialog.openQuestion(getActiveShell(), title, msg);
	}

	/**
	 * @return Le {@link Shell} de la fenêtre active s'il existe, <code>null</code> sinon.
	 */
	public static Shell getActiveShell() {
		return Display.getCurrent().getActiveShell();
	}

	/**
	 * @return Le {@link Shell} de la fenêtre active s'il existe, sinon on en crée un nouveau.
	 */
	private static Shell getShell() {
		Shell shell = null;
		try {
			final IWorkbench workbench = PlatformUI.getWorkbench();
			if (workbench != null) {
				final IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
				if (window != null) {
					shell = window.getShell();
				}
			}
		} catch (final Exception ex) {
			// Erreur Ignorée lors de la récup du shell
			// le shell est alors créé ci-dessous
		}
		if (shell == null) {
			shell = new Shell(Display.getCurrent());
		}
		return shell;
	}

}
